#ifndef AGV_DISPLAY_H
#define AGV_DISPLAY_H

#include <QWidget>
#include <QDebug>
#include <QMessageBox>
#include <QTableWidget>
#include <QPushButton>
#include <QComboBox>
#include <QLineEdit>
#include <QSqlRelationalTableModel>
#include <QSqlRelationalDelegate>
#include "MyDatabase.h"
#include "AddNewAGV.h"
#include "SwitchButton.h"

namespace Ui {
class AGV_Display;
}

/**
 * @brief 数据库表显示操作界面类
 */
class AGV_Display : public QWidget
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     */
    explicit AGV_Display(QWidget *parent = nullptr);
    /**
     * @brief 析构函数
     */
    ~AGV_Display();

    /**
     * @brief  初始化界面时将数据库各表读取显示在对应界面上
     */
    void InitTable();

    /**
     * @brief  初始化下拉框显示数据
     */
    void InitComboBox();

    /**
     * @brief  初始化滑动按键
     */
    void InitSwitchButton();

    /**
     * @brief  设置赛选tableView界面数据的显示
     * @param  comboBox 下拉框对象指针
     * @param  tablenem 表名
     * @param  sql 数据库操作语句
     */
    void ShowFilterData(QComboBox *comboBox,
                        const QString &tablenem,
                        const QString &sql);

signals:
    void sendlabellist(const QStringList&, QTableView*);
    void sendtablename(QTableView*, const int&, const int&);
    void sendDBerror();
    void sendtoAPIdisplay(QTableWidget*, const int&, const int&, const int&);
    void sendnewAGV(QTableView*, const QStringList&, const QList<IconNumber>&);

public slots:
    /**
     * @brief  显示指定窗口
     * @param  stackedWidgetindex  控件stackedWidget窗口索引
     * @param  tabWidgetindex  控件tabWidget窗口索引
     */
    void display_specified_window(const int& stackedWidgetindex, const int& tabWidgetindex);

    /**
     * @brief  返回鼠标选中的Table表格中某行的数据
     * @param  index  控件tabWidget单元格索引
     */
    void getselecteddata(const QModelIndex &index);

    /**
     * @brief  获取鼠标选中的Table表格中某行的数据，显示在窗口中
     * @param  listdata  需要显示的数据列表
     * @param  table  控件tabWidget对象指针
     */
    void setlabeldata(const QStringList& listdata, QTableView* table);

    /**
     * @brief  添加新车信息
     * @param  list  新车信息列表
     */
    void addvehicle(const QStringList& list);

private slots:

    /**
     * @brief  获取/刷新数据库表数据
     */
    void on_pushButton_get_vehicle_fault_clicked();
    void on_pushButton_get_vehicle_profile_clicked();
    void on_pushButton_get_action_group_clicked();
    void on_pushButton_get_vehicle_status_clicked();
    void vehicleFailed();
    void on_pushButton_get_forward_obstacle_strategy_clicked();
    void on_pushButton_get_back_obstacle_strategy_clicked();
    void on_pushButton_get_left_obstacle_strategy_clicked();
    void on_pushButton_get_right_obstacle_strategy_clicked();
    void on_pushButton_get_tasks_clicked();
    void taskFailed();
    void on_pushButton_get_map_config_clicked();
    void on_pushButton_get_district_seats_clicked();
    void on_pushButton_get_nodes_clicked();
    void on_pushButton_get_paths_clicked();
    void on_pushButton_get_vehicle_action_set_clicked();

    /**
     * @brief  添加某张表数据
     */
    void on_pushButton_add_clicked();
    void on_pushButton_add_map_config_clicked();
    void on_pushButton_add_district_seats_clicked();
    void on_pushButton_add_forward_obstacle_strategy_clicked();
    void on_pushButton_add_back_obstacle_strategy_clicked();
    void on_pushButton_add_left_obstacle_strategy_clicked();
    void on_pushButton_add_right_obstacle_strategy_clicked();
    void on_pushButton_add_tasks_clicked();
    void on_pushButton_add_vehicle_action_set_clicked();
    void on_pushButton_clicked();
    void on_pushButton_add_nodes_clicked();
    void on_pushButton_add_paths_clicked();

    /**
     * @brief  API指令下发按键
     */
    void on_pushButton_get_map_from_vehicle_clicked();
    void on_pushButton_get_map_pgm_clicked();
    void on_pushButton_get_map_origin_clicked();
    void on_pushButton_update_map_nodes_clicked();
    void on_pushButton_select_map_nodes_clicked();

    /**
     * @brief  下拉框设计
     */
    void on_comboBox_currentTextChanged(const QString &arg1);
    void on_comboBox_vehicle_type_currentTextChanged(const QString &arg1);

    void on_comboBox_is_parent_task_currentTextChanged(const QString &arg1);
    void on_comboBox_task_status_currentTextChanged(const QString &arg1);

    /**
     * @brief  任务id输入搜索使用
     */
    void on_pushButton_search_clicked();

private:
    Ui::AGV_Display *ui;
    SwitchButton     *switchBtn_task;
    SwitchButton     *switchBtn_vehicle;
};

class Tab_Data_Storage
{
public:
    Tab_Data_Storage() {}
    ~Tab_Data_Storage() {}
};

#endif // AGV_DISPLAY_H
